package com.luzhikun.util;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author Rookie Coder
 * @Description 动态代理
 * @Date
 *
 * 代理层
 **/
public class TransactionInvocationHandler implements InvocationHandler {

    // target：目标对象，业务层的实现对象
    private Object target;

    public TransactionInvocationHandler(Object target){
        this.target=target;
    }

    // 代理类的业务方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        SqlSession session=null;
        Object object=null;
        try{
            session=SqlSessionUtil.getSqlSession();
            // 处理业务逻辑
            // method.invoke:被代理类的方法
            object=method.invoke(target,args);
            // 处理业务逻辑完成后，提交事务
            session.commit();

        }catch (Exception e){
            // 如果出现了异常，事务回滚
            session.rollback();

        }
        return object;
    }

    // 取得代理类对象
    public Object getProxy(){

        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);

    }
}
